//
//  IsoObject.h
//  IsoCplus
//
//  Created by 周张林 on 15/9/15.
//
//

#ifndef __IsoCplus__IsoObject__
#define __IsoCplus__IsoObject__

#include <vector>
#include "path/PathGrid.h"
#include "cocos2d.h"

/// iso对象基类
class IsoObject :public cocos2d::Node
{
    
private:
    
    cocos2d::Vec3 _pos3D;
    int _nodeX=1,_nodeZ = 1;
    std::vector<cocos2d::Vec3> _spanPosArray;
    bool _isRotate = false;
    cocos2d::Rect _boundingBox ;
    float _centerOffsetY = 0;

protected:
    
    int _size ;
    int _spanX,_spanZ;
    
public:
    
    bool isSort = false;
    
public:
    static IsoObject* create(unsigned int size,unsigned int spanX =1,unsigned int spanZ=1);
    ~IsoObject();
    
    virtual bool init(unsigned int size,unsigned int spanX,unsigned int spanZ);
    
    /**
     *  iso坐标系在X方向占用的格子数量
     *
     *  @return 格子数量
     */
    int getSpanX()const;
    
    /**
     *  iso坐标系在Z方向占用的格子数量
     *
     *  @return 格子数量
     */
    int getSpanZ() const;
    float getCenterY() const;
    
    /**
     *  返回格子的大小
     *
     *  @return 格子大小
     */
    int getSize() const;
    
    /**
     *  范围
     *
     *  @return
     */
    cocos2d::Rect& boundingBox();
    
    /**
     *  对当前对象进行深度排序
     */
    virtual void sort();
    
    /**
     *  正反旋转
     *
     *  @param value 正还是反
     */
    void rotateX(bool value);
    
    /**
     *  更新场景位置
     */
    void updateScreenPos();
    
    /**
     *  更新占用的格子
     */
    void updateSpanPos();
    
    /**
     *  获取此对象占用的格子
     *
     *  @return 格子数组
     */
    const std::vector<cocos2d::Vec3> &getSpanPosArray() const;
    
    /**
     *  设置在iso坐标系的X坐标
     *
     *  @param value 值
     */
    void setX(float value);
    float getX() const;
    
    /**
     *  设置在iso坐标系的Y坐标
     *
     *  @param value 值
     */
    void setY(float value);
    float getY() const;
    
    /**
     *  设置在iso坐标系的Z坐标
     *
     *  @param value 值
     */
    void setZ(float value);
    float getZ() const;
    
    /**
     *  直接设置iso坐标像素位置
     *
     *  @param pos Vec3&
     */
    void setPos3D(cocos2d::Vec3 &pos);
    
    /**
     *  获取iso坐标像素位置
     *
     *  @return 位置
     */
    const cocos2d::Vec3& getPos3D() const;
    
    /**
     *  用于深度排序
     *
     *  @return 深度值
     */
    virtual float getDepth();
    
    int getNodeX() const;
    int getNodeZ() const;
    void setNodePosition(int nodeX,int nodeZ);
    
    /**
     *  设置在普通坐标系的位置
     *
     *  @param x
     *  @param y
     */
    void setScreenPos(float x,float y);
    
    void setWalkable(bool value,PathGrid *grid);
    bool getWalkable(PathGrid *grid) const;
    
    /**
     *  判断在PathGrid中当前对象是否可以旋转
     *
     *  @param grid 格子数据
     *
     *  @return 可以旋转返回true，否则返回false
     */
    bool getRotatable(PathGrid *grid);
};


#endif /* defined(__IsoCplus__IsoObject__) */
